package com.shujia.scala

object Demo5Function {
  def main(args: Array[String]): Unit = {

    /**
     * 函数和方法
     * 方法: 定义在类中，需要通过类的对象来调用
     * 函数： 定义再object或者代码块中，可以直接调用
     */
    //定义函数
    def add(a: Int, b: Int): Int = {
      return a + b
    }

    //调用函数
    val a: Int = add(10, 20)
    println(a)

    /**
     * 函数简写
     * 1、如果最后一行作为返回值，return可以省略
     * 2、如果函数只有一行代码逻辑{}可以省略
     * 3、返回值类型可以自动推断
     * 4、如果没有头参数()可以省略
     */

    def add1(a: Int, b: Int): Int = a + b

    println(add1(20, 30))

    def fun = println("fun111")
    //调用函数
    fun

    /**
     * lambda表达式  -- 匿名函数
     * 前面是参数列表后面是返回值
     */
    val f = (a: Int, b: Int) => a + b

    println(f(1, 2))

    /**
     * 函数可变参数
     *
     */
    def fun1(i: Int*): Unit = {
      println(i)
    }

    fun1(1, 2, 3, 4, 5, 6, 7)


    /**
     * 函数参数默认值
     */

    def fun2(i: Int, j: Int = 2): Int = {
      i * j
    }

    println(fun2(1))
    println(fun2(1, 10))


    /**
     * 递归
     *
     */
    //阶层

    def chen(i: Int): Int = {

      if (i == 1) {
        return 1
      }

       i * chen(i - 1)
    }

    println(chen(5))


  }


}
